<?php
$cwd = getcwd();
chdir('../../');
require_once('challenge/html_head.php');
html_head('PHP0816 Challenge - The Highlighter');
chdir($cwd);
# globals
global $highlights;
$highlights = array();
/**
* Parse the GET parameters.
*/
foreach ($_GET as $key => $value)
{
if ($key === 'src') {
php0816SetSourceFile($value);
}
elseif ($key === 'mode') {
php0816execute($value);
}
elseif ($key === 'hl') {
php0816addHighlights($value);
}
}
/**
* Make magic quotes off !
* (it is really defined in /include/util/Class_Common.php and will deprecate soon)
* (also you can look on the html_head() stuff, etc. WeChall source is public domain)
* (if you like a hint: There is a main logical error in this script, applies to all programming languages, not only php. H4\/3: |> |-| |_| |\|)
*/
/*
final class Common
{
public function getGet($varname, $default=false)
{
if (!isset($_GET[$varname])) {
return $default;
}
return
get_magic_quotes_gpc() > 0 ?
stripslashes($_GET[$varname]) :
$_GET[$varname];
}
}
*/
/**
* Set the text file to show.
* Sanitize Get Parameter.
* Only allow 3 different files by whitelist at the moment.
* TODO: broken ?!? people can see other files ! :(
* @param $filename string - the filename
* @return void
*/
function php0816SetSourceFile($filename)
{
$filename = (string) $filename;
static $whitelist = array(
'test.php',
'index.php',
'code.php',
);
# Sanitize by whitelist
if (!in_array($filename, $whitelist, true))
{
$_GET['src'] = false;
}
}
/**
* Add the highlighter keywords.
* @param $keyword array of strings - the highlighting keywords
* @return void
*/
function php0816addHighlights($keywords)
{
global $highlights;
if (!is_array($keywords)) { return true; }
foreach($keywords as $k)
{
$highlights[] = $k;
}
}
/**
* Execute action.
* Currently only hl is known.
* @param $mode
* @return void
*/
function php0816execute($mode)
{
switch($mode)
{
case 'hl': php0816Highlighter(); break;
}
}
/**
* Call the highlighter :)
* sweeeeet.
* @return void
*/
function php0816Highlighter()
{
global $highlights; # <-- global highlights :D
# SOMEONE SAID THIS WILL FIX IT, BUT PEOPLE CAN STILL SEE solution.php :( #
$filename = str_replace(array('/', '\\', '..'), '', Common::getGet('src'));#
if (false === ($text = @file_get_contents($filename)))
{
echo '<div>File not Found: '.htmlspecialchars($filename, ENT_QUOTES).'</div>';
return false;
}
$text = htmlspecialchars($text, ENT_QUOTES);
foreach ($highlights as $highlight)
{
$stlye = 'color:#CD7F32; background-color:white; padding: 0 8px;';
$text = str_replace($highlight, '<b style="'.$stlye.'">'.$highlight.'</b>', $text);
}
echo '<pre>'.$text.'</pre>';
}
$cwd = getcwd();
chdir('../../');
require_once('challenge/html_foot.php');
chdir($cwd);
?>